#pragma once

#include <pthread.h>
#include "ShmMutex.hpp"

// 适用于共享内存的条件变量
class ShmCond
{
public:
    // 构造函数
    ShmCond() {
        // 初始化可以在进程间使用的条件变量属性
        pthread_condattr_t cond_attr;
        pthread_condattr_init(&cond_attr);
        pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED);
        pthread_cond_init(&_cond, &cond_attr);
        pthread_condattr_destroy(&cond_attr);
    }

    // 析构函数
    ~ShmCond() {
        pthread_cond_destroy(&_cond);
    }

    // 等待条件变量满足
    void Wait(ShmMutex& mutex) {
        pthread_cond_wait(&_cond, &mutex._mtx);
    }

    // 等待条件变量满足
    void Wait(pthread_mutex_t& mutex) {
        pthread_cond_wait(&_cond, &mutex);
    }

    // 等待一段时间或者条件变量满足
    int TimedWait(ShmMutex& mutex, const struct timespec* abs_timeout) {
        return pthread_cond_timedwait(&_cond, &mutex._mtx, abs_timeout);
    }

    // 等待一段时间或者条件变量满足
    int TimedWait(pthread_mutex_t& mutex, const struct timespec* abs_timeout) {
        return pthread_cond_timedwait(&_cond, &mutex, abs_timeout);
    }

    // 唤醒一个等待条件变量的线程
    void Signal() {
        pthread_cond_signal(&_cond);
    }

    // 唤醒所有等待条件变量的线程
    void Broadcast() {
        pthread_cond_broadcast(&_cond);
    }

private:
    pthread_cond_t _cond;  // 条件变量
};